package co.baiku.boot.core.orm.dao;

import co.baiku.boot.core.orm.bin.TemplateBuilder;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;

import javax.persistence.EntityManager;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

@NoRepositoryBean
public interface BaseDAO<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, JpaSpecificationExecutor<T>, JpaRepository<T, ID> {
    T getById(ID id);

    List<T> findByIdIn(Collection<ID> ids);

    List<Map<String, Object>> templateQuery(String templateId, Map<?, ?> params);

    List<T> templateQuery(String templateId, Map<?, ?> params, Class<T> clazz);

    /**
     * 独立事务,执行完成即提交事务
     *
     * @param templateId
     * @param params
     * @return
     */
    int templateUpdate(String templateId, Map<?, ?> params);

    /**
     * 使用外部事物,例如放到service中时,使用service的entityManager可以和service在同一个事务之下
     *
     * @param entityManager
     * @param templateId
     * @param params
     * @return
     */
    int templateUpdate(EntityManager entityManager, String templateId, Map<?, ?> params);

    /**
     * 动态更新，更新不为null的字段和updateAt字段
     *
     * @param entity
     * @return
     */
    int dynamicUpdate(T entity);

    /**
     * 通过模版构建工具执行模版sql
     *
     * @param templateId 模版ID
     * @return
     */
    TemplateBuilder templateBuilder(String templateId);

    /**
     * 获取模板sql
     *
     * @param templateId
     * @return
     */
    String templateSql(String templateId);

    /**
     * 获取模板sql
     *
     * @param templateId
     * @param params
     * @return
     */
    String templateSql(String templateId, Map<?, ?> params);


    <S extends T> Iterable<S> batchSave(Iterable<S> var1);

    <S extends T> Iterable<S> batchUpdate(Iterable<S> var1);
}
